#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//int cmp_name(const void* p1, const void* p2) //void*可以接收任何类型的指针
//{
//	return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p1)->name); //升序
//	//return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name); //降序
//	
//}
//void test3()
//{
//	struct Stu arr[] = { {"zhangsan",20},{"lisi",50},{"wangwu",15} };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp_name);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%s ", arr[i].name);
//	}
//}
//
//int main()
//{
//
//	test3(); //测试排序字符串数组
//	return 0;
//}

//int cmp_char(const void* p1, const void* p2) //void*可以接收任何类型的指针
//{
//	return *(char*)p1 - *(char*)p2; //升序
//	//return *(char*)p2 - *(char*)p1; //降序
//}
//test2()
//{
//	char arr[] = "cbfdehag";
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(char), cmp_char);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%c ", arr[i]);
//	}
//}
//
//int main()
//{
//
//	test2(); //测试排序字符串数组
//	return 0;
//}



int cmp_int(const void* p1, const void* p2) //void*可以接收任何类型的指针
{
	return *(int*)p1 - *(int*)p2; //升序
	//return *(int*)p2 - *(int*)p1; //降序
}
void Swap(char* buf1,char*buf2,int size)//交换arr[j]和arr[j+1]这个元素
{
	int i = 0;
	char temp = 0;
	for (i = 0; i < size; i++)//逐个字节交换
	{
		temp = *buf1;
		*buf1  = *buf2;
		*buf2  = temp;
		buf1++;
		buf2++;
	}
}
void bubble_qsort(void* base, int num, int size, int(*cmp)(const void*,const void*))
{
	int i = 0;
	//趟数
	for (i = 0; i < num - 1; i++)
	{
		int j = 0;
		//一趟比较的对数
		for (j = 0; j < num - 1 - i; j++)
		{
			//假设我们需要升序，也就是返回值>0,需要交换
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//两两比较
			{
				//交换
				Swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}
void test1()
{
	int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_qsort(arr, sz, sizeof(int), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{

	test1(); //测试排序整型数组
	return 0;
}


//int main()
//{
//	int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	//趟数
//	for (i = 0; i < sz - 1; i++)
//	{
//		//一趟比较
//		//两两相邻元素比较
//		int j = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//			}
//		}
//	}
//	//打印
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}